Takže vyvíjím sociální hru, kde máte určitý čas na splnění úkolu. Jelikož je sociální, můžete si s druhým hráčem povídat. Pokaždé, když obdržíte chatovou zprávu, obdržíte také upozornění a po kliknutí na ni budete přesměrováni na chatovou obrazovku s ním. Právě teď to funguje dobře. To, co nechci, je, že uživatel obdrží upozornění na chat, zatímco ve skutečnosti hraje na PlayActivity. Bylo by také dobré, kdyby již zobrazené oznámení mohlo být ignorováno nebo pozastaveno na později, když je na PlayActivity. Je to proveditelné? Jiný přístup by mohl být zrušit všechna již zobrazená oznámení a uvést BroadcastReceiver do režimu spánku a oživit všechna oznámení a BroadcastReceiver po dokončení PlayActivity? Ani to není možné? Mohla by se aplikace před opuštěním aktivity alespoň zeptat? tak jsem ho mohl varovat, a pokud stále odejde, hra by mohla být proti němu oceněna. To, co dělám právě teď, je jen řešení, nastavím PlayActivity na celou obrazovku a zkontroluji, zda se změnilo fokus např. pokud táhne dolů stavový řádek / oznamovací oblast. Ale to je jen hack, něco, co bych s tím opravdu rád odstranil. Jak vidíte, nejsem si úplně jistý, jaký by zde mohl být správný přístup. Co by v mém případě udělal profesionální vývojář softwaru pro Android? Díky předem! Právě teď zpracovávám oznámení rozšířením BroadcastReceiver. Kód je připojen na konci, pokud potřebujete další části mého kódu, dejte mi vědět! veřejná třída PushBroadcastReceiver rozšiřuje BroadcastReceiver { @ Přepis public void onReceive (kontextový kontext, záměr záměr) { Snaž se { JSONObject json = nový JSONObject ( intent.getExtras () .getString ("KLÍČ")); oznámit (kontext, záměr, json); } chytit (JSONException e) { L.debug (App.TAG, "JSONException:" + e.getMessage ()); } } private void notify (Context ctx, Intent i, JSONObject dataObject) hodí JSONException { NotificationManager nm = (NotificationManager) ctx.getSystemService (Context.NOTIFICATION_SERVICE); boolean createNotification = false; PendingIntent pi = null; int gameId = 0; // povídat si if (dataObject.getString ("KEY_CHAT"). equals ("VALUE_CHAT")) { Intent intent = new Intent (ctx, ChatActivity.class); intent.putExtra ("oponentUsername", dataObject.getString (PARSE_JSON_OPPONENT_USERNAME_KEY)); intent.putExtra ("gameId", dataObject.getString (PARSE_JSON_GAME_ID_KEY)); pi = PendingIntent.getActivity (ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); gameId = Integer.parseInt (dataObject.getString (PARSE_JSON_GAME_ID_KEY)); createNotification = true; // hra } else if (dataObject.getString ("KEY_GAME"). equals ("VALUE_GAME")) { Intent intent = new Intent (ctx, SS6RunningGameActivity.class); intent.putExtra ("gameId", dataObject.getString (PARSE_JSON_GAME_ID_KEY)); gameId = Integer.parseInt (dataObject.getString (PARSE_JSON_GAME_ID_KEY)); pi = PendingIntent.getActivity (ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); createNotification = true; } if (createNotification) { Zvuk Uri = Uri.parse ("android.resource: //" + ctx.getPackageName () + "/" + R.raw.push_notif); int ikona = R.drawable.icon_notification_android; String tickerText = dataObject.getString ("TEXT"); Oznámení mNotification = nový NotificationCompat.Builder (ctx) .setContentTitle (ctx.getResources (). getString (R.string.app_name)) .setContentText (tickerText) .setSmallIcon (ikona) .setContentIntent (pi) .setSound (zvuk) .setDefaults (Notification.DEFAULT_VIBRATE) .setAutoCancel (true) .setStyle (nový NotificationCompat.BigTextStyle () .bigText (tickerText)) .stavět(); nm.notify (gameId, mNotification); } }
2021-02-05 08:15:48
K tomu může být mnoho přístupů. Jedním z nejjednodušších by bylo následující: Použijte SharedPreferences. Přidejte logickou hodnotu, která označuje, že PlayActivity právě běží. V onCreate (Bundle) of PlayActivity, proveďte následující: // Inicializace SharedPreferences preferences = getSharedPreferences ("MY_PREF_FILE_NAME", 0); Editace editoru = preference.edit (); // Zde je „PLAY_ACTIVITY_IS_RUNNING“ „klíč“ a „true“ je hodnota // Říkáme, že běží `PlayActivity` edit.putBoolean ("PLAY_ACTIVITY_IS_RUNNING", true); edit.commit (); Nyní v onPause () PlayActivity nastavte tento boolean na false - což naznačuje, že se chystáme opustit PlayActivity: // Inicializace SharedPreferences preferences = getSharedPreferences ("MY_PREF_FILE_NAME", 0); Editace editoru = preference.edit (); // Zde je „klíč PLAY_ACTIVITY_IS_RUNNING“ a hodnota „false“ je hodnota // Říkáme, že `PlayActivity` již nefunguje edit.putBoolean ("PLAY_ACTIVITY_IS_RUNNING", false); edit.commit (); Zbytek je docela jednoduchý. V PushBroadcastReceiver otevřete SharedPreferences a zkontrolujte hodnotu přiřazenou klíči PLAY_ACTIVITY_IS_RUNNING. Pokud je tato hodnota nepravdivá, pokračujte ve zveřejňování oznámení. Jinak je sbírejte na později. public class PushBroadcastReceiver rozšiřuje BroadcastReceiver { @ Přepis public void onReceive (kontextový kontext, záměr záměr) { SharedPreferences předvolby = context.getSharedPreferences ( „MY_PREF_FILE_NAME“, 0); // Načíst hodnotu uloženou pro klíč „PLAY_ACTIVITY_IS_RUNNING“ // Druhý argument `false` je výchozí hodnota // v případě, že klíč neexistuje - je to logicky v pořádku boolean playActivityIsRunning = preference.getBoolean ( „PLAY_ACTIVITY_IS_RUNNING“, nepravda) // PlayActivity is running if (playActivityIsRunning) { // někde ukládat objekty JSON a řešit je později } else { Snaž se { JSONObject json = nový JSONObject (intent.getExtras (). GetString ("KLÍČ")); oznámit (kontext, záměr, json); } chytit (JSONException e) { L.debug (App.TAG, "JSONException:" + e.getMessage ()); } } } private void notify (Context ctx, Intent i, JSONObject dataObject) hodí JSONException { .... .... } } Budete muset najít způsob, jak zveřejnit čekající oznámení. Jedním z řešení je odeslat samostatné vysílání jinému BroadcastReceiver v onPause () PlayActivity. Ale to by mohlo být problematické, protože onPause () se volá, i když uživatel mění orientaci. Možná může tento BroadcastReceiver začít pracovat po zpoždění 1 sekundy? To by byl dostatečný čas na to, aby byla aktivita znovu vytvořena - a hodnota PLAY_ACTIVITY_IS_RUNNING resetována (protože bude znovu vyvolána onCreate (Bundle) of PlayActivity). Tok by tedy byl: volá se pauza v SharedPreferences nastavte hodnotu na false odeslat vysílání za účelem řešení nevyřízených oznámení umístěte kód BroadcastReceiver do Runnable. Zašlete tento spustitelný soubor se zpožděním 1 sekundy pomocí obslužné rutiny. uvnitř BroadcastReciever => zkontrolujte hodnotu PLAY_ACTIVITY_IS_RUNNING v SharedPreferences <= to bude provedeno po 1 sekundě. Pokud uživatel změnil pouze orientaci obrazovky, hodnota PLAY_ACTIVITY_IS_RUNNING by byla pravdivá. V opačném případě, pokud je uživatel navigován od PlayActivity, hodnota by byla nepravdivá. 7 | Tvoje odpověď StackExchange.ifUsing ("editor", function () { StackExchange.using ("externalEditor", function () { StackExchange.using ("snippets", function () { StackExchange.snippets.init (); }); }); }, „code-snippets“); StackExchange.ready (funkce () { var channelOptions = { tagy: "" .split (""), id: "1" }; initTagRenderer ("". split (""), "" .split (""), channelOptions); StackExchange.using ("externalEditor", function () { // Je nutné po úryvcích vypálit editor, pokud jsou úryvky povoleny if (StackExchange.settings.snippets.snippetsEnabled) { StackExchange.using ("snippets", function () { createEditor (); }); } else { createEditor (); } }); funkce createEditor () { StackExchange.prepareEditor ({ useStacksEditor: false, heartbeatType: 'answer', autoActivateHeartbeat: false, convertImagesToLinks: true, noModals: true, showLowRepImageUploadWarning: true, reputationToPostImages: 10, bindNavPrevention: true, postfix: "", imageUploader: { brandingHtml: "Používá \ u003ca href = \" https: //imgur.com/ \ "\ u003e \ u003csvg class = \" svg-ikona \ "width = \" 50 \ "height = \" 18 \ "viewBox = \ "0 0 50 18 \" fill = \ "none \" xmlns = \ "http: //www.w3.org/2000/svg \" \ u003e \ u003cpath d = \ "M46.1709 9.17788C46.1709 8.26454 46,2665 7,94324 47,1084 7,58816C47.4091 7,46349 47,7169 7,36433 48,0099 7,26993C48,9099 6,97977 49,672 6,73443 49,672 5,93063C49,672 5,22043 48,9832 4,61182 48,1414 4,61182C47,4335 4,61182 46,7256 4,91650 4,416 43.1481 6.59048V11.9512C43.1481 13.2535 43.6264 13.8962 44.6595 13.8962C45.6924 13.8962 46.1709 13.2535 46.1709 11.9512V9.17788Z \ "/ \ u003e \ u003cpath d = \" M32.492 10.1419C32.418 34,14437,0451 14,0484C39.9723 14,0484 41,5985 12,6954 41,5985 10,1419V6,59049C41,5985 5,2881 41,1394 4,66232 40,1061 4,66232C39,0732 4,66232 38,5948 5,2881 35,545,4545 35,4545 11,4545 11,4545 4954 5,28821 35,0173 4,66232 34,0034 4,66232C32,9703 4,66232 32,492 5,28821 32,492 6,59049V10.1419Z \ "/ \ u003e \ u003cpath fill-rule = \" evenodd \ "clip-rule = \" evenodd \ "d = \" M25.6622 17,6335 C27.8049 17,6335 29,3739 16,9402 30,2537 15,6379C30,8468 14,7755 30,9615 13,5579 30,9615 11,9512V6,59049C30.9615 5,2888 21 30,4833 4,66231 29,4502 4,66231C28.9913 4,66231 28,455 4,94978 28,109 5,79 21,607 5,13 C21.0134 11.9852 23.003 13.913 25.3754 13.913C26.5612 13.913 27.4607 13.4902 28.1109 12.6616C28.1109 12.7229 28.1161 12.7799 28.121 12.8346C28.1256 12.8854 28.1301 12.9342 28.1301 12.983C28.1301 14.43 349 15,2321 24,1352 14,9821 23,5661 14,7787C23,176 14,6393 22,8472 14,5218 22,5437 14,5218C21,7977 14,5218 21,2429 15,0123 21,2429 15,68787 21,2429 16,73 7,307 17,244 28,2424 7,244 26,2424 7,2424 26,244 26,2424 26,244 26,2424 26,24 24,27 C28.0918 10.6321 27.2311 11.5116 26.1024 11.5116C24.9737 11.5116 24.1317 10.6491 24.1317 9.27932Z \ "/ \ u003e \ u003cpath d = \" M16.8045 11,9512C16.8045 13,2535 17,2637 13,8962 18,2965 13,82 2,1865 13,82 2,1865 13,82 2,1865 13,82 2,1865 13,82 2,2 12928C19.8079 5,82936 18,4879 4,62866 16,4027 4,62866C15,1594 4,62866 14,279 4,98375 13,3609 5,88013C12,653 5,05154 11,6581 4,62866 10,3573 4,62866C9,34336 4,62866 8,57809 4,89931 7,94666 5,5079C7,58314 4,9328,62 9512C5.00066 13.2535 5.47873 13.8962 6.51203 13.8962C7.54479 13.8962 8.0232 13.2535 8.0232 11.9512V8.90741C8.0232 7.58817 8.44431 6.91179 9.53458 6.91179C10.5104 6.91179 10. 893 7,58817 10,893 8,94108V11,9512C10,893 13,2535 11,3711 13,8962 12,4044 13,8962C13,4375 13,8962 13,9157 13,2535 13,9157 11,9512V8,90741C13,9157 7,58817 14,3365 6,91179 15,4269 6,91179C16.4027 8,80 d = \ "M3.31675 6.59049C3.31675 5.28821 2.83866 4.66232 1.82471 4.66232C0.791758 4.66232 0.313354 5.28821 0.313354 6.59049V11.9512C0.313354 13.2535 0.791758 13.8962 1.82471 13.8962C2.85798 13.8963 3.316 \ u003cpath d = \ "M1.87209 0.400291C0.843612 0.400291 0 1.1159 0 1.98861C0 2.87869 0.822846 3.57676 1.87209 3.57676C2.90056 3.57676 3.7234 2.87869 3.7234 1.98861C3.7234 1.1159 2.90056 0.400291 \ "/ \ u003e \ u003c / svg \ u003e \ u003c / a \ u003e", contentPolicyHtml: "Uživatelské příspěvky jsou licencovány pod \ u003ca href = \" https: //stackoverflow.com/help/licensing \ "\ u003ecc by-sa \ u003c / a \ u003e \ u003ca href = \" https://stackoverflow.com / legal / content-policy \ "\ u003e (obsahové zásady) \ u003c / a \ u003e", allowUrls: true }, onDemand: true, discardSelector: ".discard-answer" , okamžitěShowMarkdownHelp: true, enableTables: true, enableSnippets: true }); } }); Děkujeme, že jste přispěli odpovědí na Stack Overflow! Nezapomeňte na otázku odpovědět. Uveďte podrobnosti a sdílejte svůj výzkum! Ale vyhnout se ... Žádáme o pomoc, vysvětlení nebo reagujeme na jiné odpovědi. Vytváření prohlášení na základě názoru; podpořte je referencemi nebo osobními zkušenostmi. Další informace najdete v našich tipech na psaní skvělých odpovědí. Koncept uložen Koncept zahozen Zaregistrujte se nebo se přihlaste StackExchange.ready (funkce () { StackExchange.helpers.onClickDraftSave ('# login-link'); }); Zaregistrujte se pomocí Google Zaregistrujte se pomocí Facebooku Zaregistrujte se pomocí e-mailu a hesla Předložit Zveřejněte jako host název E-mailem Povinné, ale nikdy zobrazené StackExchange.ready ( funkce () { StackExchange.openid.initPostLogin ('. New-post-login', 'https% 3a% 2f% 2fstackoverflow.com% 2fquestions% 2f25114521% 2fis-it-possible-to-suspend-already-shown-and-new-notifications- for-an-amount-of% 23new-answer ',' question_page '); } ); Zveřejněte jako host název E-mailem Povinné, ale nikdy zobrazené Zveřejněte svou odpověď Vyřadit Kliknutím na „Odeslat odpověď“ vyjadřujete souhlas s našimi podmínkami služby, zásadami ochrany osobních údajů a zásadami používání souborů cookie Toto není odpověď, kterou hledáte? Projděte si další otázky se štítky oznámení Android push nebo se zeptejte na vlastní otázku.